package aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @BelongsProject: springboot_demo
 * @BelongsPackage: aop
 * @Author: 江岸
 * @CreateTime: 2021-05-25 10:44
 * @Description: 使用jdk的通用代理类
 */
public class DynamicAgent {
    //实现InvocationHandler接口，并且可以初始化被代理类的对象
    static class MyHandler implements InvocationHandler{
        private Object proxy;
        public MyHandler(Object proxy) {
            this.proxy = proxy;
        }

        /**
         *
         * @param proxy 被代理的类的实例
         * @param method 调用被代理的类的方法
         * @param args 该方法需要的参数
         * @return
         * @throws Throwable
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println(">>>>before");
            //真正调用的对象
            Object invoke = method.invoke(this.proxy, args);
            System.out.println(">>>>after");
            return invoke;
        }
    }

    //返回一个被修改过的对象
    public static Object agent(Class interfaceClazz, Object proxy ){
//        loader：被代理的类的类加载器
//        interfaces：被代理类的接口数组
//        invocationHandler：就是刚刚介绍的调用处理器类的对象实例
        return Proxy.newProxyInstance(interfaceClazz.getClassLoader(),new Class[]{interfaceClazz},new MyHandler(proxy));
    }
}
